/**
 * Clasa Ln se refera la functia logaritm (logaritm in baza a din x)
 * Derivata functiei este 1/x*ln(a)
 */
package q10.Functii.FunctiiElementare;

import q10.Operatori.Cat;
import q10.Functii.*;

public class Ln extends Functie {

	/**Metoda calcul() apeleaza metoda Calcul(double) 
	 *@return double 
	 */
	public double calcul() {
		if (fStang == null)
            System.exit(1);

        return Calcul(fStang.calcul());
	}
	
	/**Metoda Calcul calculeaza valoarea logaritm in baza a din x
	 * 
	 * @param aux1  valoarea din logaritm
	 * @return double
	 */
	public static double Calcul(double aux1)
    {
        return Math.log(aux1);
    }

	/**Metoda calculDerivata() calculeaza valoarea derivatei functiei logaritmice. 
	 * Foloseste metoda Calcul(double,double) mostenita din clasa Cat.
	 * @return double
	 */
	public double calculDerivata() {
		if (fStang == null)
            System.exit(1);

        return Cat.Calcul(1,fStang.calculDerivata());
	}

	/** Metoda derivare() returneaza String-ul rezultat derivarii functiei logaritmice.
	 * Apeleaza functia concatTermens din clasa Cat
	 * @return String
	 * */
	public String derivare() {
		if (fStang == null)
            System.exit(1);

        return Cat.concatTermens("1",fStang.derivare());
	}
	

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		if (fStang == null)
            System.exit(1);

        return concatTermeni(fStang.toString());
	}
	/**Metoda concatTermeni(String aux1) concateneaza termenii functiei pentru a putea fi afisati
	 * 
	 * @param aux1  valoarea din logaritm
	 * @return String
	 */
	public static String concatTermeni(String aux1)
    {
        String aux;
        int nrP;

        nrP = aux1.charAt(0) == '(' ? 0 : 2;

        aux = "ln";
        if (nrP != 0) aux += "(";
        aux += aux1;
        if (nrP != 0) aux += ")";

        return aux;
    }
}
